home *** CD-ROM | disk | FTP | other *** search
- ;
- ; writechr: Write a single character in AL to the console without
- ; mangling any registers. This does raw console writes,
- ; since some PXE BIOSes seem to interfere regular console I/O.
- ;
- %if IS_ISOLINUX
- writechr_full:
- %else
- writechr:
- %endif
- push ds
- push cs
- pop ds
- call write_serial ; write to serial port if needed
- pushfd
- test byte [DisplayCon],01h ; Write to screen?
- jz .nothing
-
- pushad
- mov bh,[BIOS_page]
- push ax
- mov ah,03h ; Read cursor position
- int 10h
- pop ax
- cmp al,8
- je .bs
- cmp al,13
- je .cr
- cmp al,10
- je .lf
- push dx
- mov bh,[BIOS_page]
- mov bl,07h ; White on black
- mov cx,1 ; One only
- mov ah,09h ; Write char and attribute
- int 10h
- pop dx
- inc dl
- cmp dl,[VidCols]
- jna .curxyok
- xor dl,dl
- .lf: inc dh
- cmp dh,[VidRows]
- ja .scroll
- .curxyok: mov bh,[BIOS_page]
- mov ah,02h ; Set cursor position
- int 10h
- .ret: popad
- .nothing:
- popfd
- pop ds
- ret
- .scroll: dec dh
- mov bh,[BIOS_page]
- mov ah,02h
- int 10h
- mov ax,0601h ; Scroll up one line
- mov bh,[ScrollAttribute]
- xor cx,cx
- mov dx,[ScreenSize] ; The whole screen
- int 10h
- jmp short .ret
- .cr: xor dl,dl
- jmp short .curxyok
- .bs: sub dl,1
- jnc .curxyok
- mov dl,[VidCols]
- sub dh,1
- jnc .curxyok
- xor dh,dh
- jmp short .curxyok
-
-